import { MyGameObject } from '/static/Javascript/MyGameObject/base.js';

export class Player extends MyGameObject {
    // 类的构造函数，在创建GameMap类的实例时会被调用，接收一个参数root(即MyGameObject对象)和info(玩家的信息)
    constructor(root, info) {
        super();
        this.root = root;
        // 从info对象中获取玩家角色的id信息，并赋值给当前类实例的this.id属性，用于标识玩家角色的唯一性
        this.id = info.id;
        // 从info对象中获取玩家角色的初始x坐标信息，并赋值给当前类实例的this.x属性，用于后续确定玩家在游戏画面中的水平位置
        this.x = info.x;
        // 同理，从info对象中获取玩家角色的初始y坐标信息，并赋值给当前类实例的this.y属性，用于确定玩家在游戏画面中的垂直位置
        this.y = info.y;
        // 获取玩家角色的宽度信息，赋值给this.width属性，用于后续绘制玩家角色图形等操作中确定图形的宽度尺寸
        this.width = info.width;
        // 获取玩家角色的高度信息，赋值给this.height属性，用于确定图形的高度尺寸
        this.height = info.height;
        // 获取玩家角色的颜色信息，赋值给this.color属性，后续在绘制玩家角色时会使用这个颜色来填充图形
        this.color = info.color;
        // 初始化玩家角色在水平方向的速度分量为0，后续可以根据游戏中的操作或者逻辑来改变这个值，以实现水平方向的移动
        this.vx = 0;
        // 初始化玩家角色在垂直方向的速度分量为0，同样可根据实际情况改变，例如实现跳跃等垂直方向的运动
        this.vy = 0;
        // 定义玩家角色在水平方向的移动速度，这里设置为400，用于控制玩家角色在水平方向移动的快慢程度
        this.speedx = 400;
        // 定义玩家角色在跳跃时的初始垂直速度，设置为-1000，用于控制跳跃的初始力度等相关特性
        this.speedy = -1000;
        //获取游戏地图（通过this.root关联到游戏根对象，再访问其game_map属性获取游戏地图对象）的绘图上下文对象（ctx)
        this.ctx = this.root.game_map.ctx;
        // 定义玩家角色所受的重力加速度，设置为50
        this.gravity = 50;
        // 定义玩家角色的方向，正方向为1
        this.direction = 1;
    }

    start() {

    }

    // 定义move方法，用于处理玩家角色的移动逻辑，根据当前的速度、重力以及时间间隔等因素来更新玩家角色的位置坐标
    move() {
        // 在垂直方向上，根据重力加速度来更新垂直速度分量，每一次调用该方法时，垂直速度都会增加相应的重力值，
        // 以此模拟现实世界中物体在重力作用下速度不断变化的情况，实现玩家角色下落等垂直方向的运动效果
        this.vy += this.gravity;
        // 在水平方向上，根据当前水平速度分量（this.vx）、时间间隔（this.timedelta），来更新玩家角色的水平坐标（this.x），
        // 这样能使玩家角色在水平方向上按照设定的速度和实际经过的时间进行移动，保证移动距离与时间和速度的关系符合物理逻辑
        this.x += this.vx * this.timedelta / 1000;
        // 同理，在垂直方向上，依据垂直速度分量（this.vy）、时间间隔（this.timedelta）来更新玩家角色的垂直坐标（this.y），
        // 使得玩家角色在垂直方向上也能根据速度和时间准确地移动，比如跳起后随着时间上升和下落等
        this.y += this.vy * this.timedelta / 1000;

        // 判断玩家角色的垂直坐标（this.y）是否超过了某个特定值（这里是450），如果超过了，说明玩家角色到达了地面，
        // 此时将玩家角色的垂直坐标设置为450，使其固定在这个位置上，同时将垂直速度分量重置为0，模拟玩家角色落地停止的状态，
        // 避免玩家角色持续下落穿透地面等不符合实际物理逻辑的情况出现
        if (this.y > 450) {
            this.y = 450;
            this.vy = 0;
        }
    }

    update() {
        this.move();
        this.render();
    }

    //表示玩家角色在游戏画面中的呈现形式（这里简单地将玩家角色用矩形来表示）
    render() {
        this.ctx.fillStyle = this.color;
        this.ctx.fillRect(this.x, this.y, this.width, this.height);
    }
}
